
// loader还可以分成二种 
// 1.最左则的必须要返回JS，因为最左则的loader结果 给webpack了，而webpack会把这个结果用AST parser按JS解析
// 2.如果不最在最左侧，只是流水线的一环。返回的肯定都是buffer和字符串

let core = require('@babel/core'); //核心库

// getOptions 获取 loader 的配置项。
// interpolateName 处理生成文件的名字。
// stringifyRequest 把绝对路径处理成相对根目录的相对路径。
const { getOptions } = require("loader-utils"); 

// 这个模块可以帮你验证 loader option 配置的合法性。
const validate = require('schema-utils');
/**
 * 
 * @param {*} source 进行数据操作的目标
 * @param {*} inputSourceMap 将打包后的代码与源码链接起来,方便开发者调试,一般通过babel生成.
 * @param {*} inputast  额外信息
 * @returns 
 */
function loader(source,inputSourceMap,inputast){
    let options = getOptions(this)||{}; //返回loader.option
    options = {
        presets:['@babel/preset-env'],
        sourceMaps:true,//生成sourcemap
        inputSourceMap,//输入的sourcemap   index.js 可能会经过好几个loader的处理，每个loader都有可能进行编译代码
        filename:this.resourcePath, //原始文件名
        ...options
    }
    let {code,map,ast} =  core.transform(source,options)

    // 定义配置项结构和类型
    let schema = {
        type: 'object',
        properties: {
            name: {
                type: 'string'
            }
        }
    }
    // 验证配置项是否符合要求。当配置项不符合要求，编译就会中断并在控制台打印错误信息
    validate(schema, options);

    //return code;//如果返回的是一值
    //如果返回的是多个值
    return this.callback(null,code,map,ast);
}

module.exports = loader
/**
 * devtool 
 * source-map 包含loader的sourcemap
 * index.js 可能会经过好几个loader的处理，每个loader都有可能进行编译代码
 * 0 =>loader 1 +1   =>loader2 2 +1
 */

